package com.agileboot.attendance.domain.record.service;

import com.agileboot.attendance.domain.record.db.entity.AttendanceRecord;
import com.agileboot.attendance.domain.record.dto.AttendanceRecordDTO;
import com.agileboot.attendance.domain.record.dto.AttendanceRecordImportDTO;
import com.agileboot.attendance.domain.record.dto.AttendanceRecordQueryDTO;
import com.agileboot.attendance.domain.record.dto.BatchImportDTO;
import com.agileboot.attendance.domain.record.dto.CalendarItemDTO;
import com.agileboot.attendance.domain.record.dto.CheckInDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 考勤记录Service接口
 *
 * @author ruoyi
 */
public interface IAttendanceRecordService extends IService<AttendanceRecord> {
    
    /**
     * 分页查询考勤记录列表
     *
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 考勤记录列表
     */
    IPage<AttendanceRecordDTO> page(IPage<AttendanceRecord> page, AttendanceRecordQueryDTO queryDTO);
    
    /**
     * 获取考勤记录详情
     *
     * @param recordId 考勤记录ID
     * @return 考勤记录信息
     */
    AttendanceRecordDTO getInfo(Long recordId);
    
    /**
     * 新增考勤记录
     *
     * @param recordDTO 考勤记录信息
     * @return 结果
     */
    boolean add(AttendanceRecordDTO recordDTO);
    
    /**
     * 修改考勤记录
     *
     * @param recordDTO 考勤记录信息
     * @return 结果
     */
    boolean update(AttendanceRecordDTO recordDTO);
    
    /**
     * 删除考勤记录
     *
     * @param recordId 考勤记录ID
     * @return 结果
     */
    boolean delete(Long recordId);
    
    /**
     * 员工打卡
     *
     * @param employeeId 员工ID
     * @return 结果
     */
    boolean checkIn(Long employeeId);
    
    /**
     * 员工签退
     *
     * @param employeeId 员工ID
     * @return 结果
     */
    boolean checkOut(Long employeeId);

    /**
     * 高级打卡（支持位置和照片）
     *
     * @param checkInDTO 打卡信息
     * @return 打卡结果
     */
    boolean advancedCheckIn(CheckInDTO checkInDTO);
    
    /**
     * 批量导入考勤记录
     *
     * @param recordList 考勤记录列表
     * @return 结果
     */
    boolean importRecords(List<AttendanceRecordDTO> recordList);
    
    /**
     * 导出考勤记录
     *
     * @param queryDTO 查询条件
     * @return 考勤记录列表
     */
    List<AttendanceRecordDTO> export(AttendanceRecordQueryDTO queryDTO);
    
    /**
     * 获取员工某月考勤统计
     *
     * @param employeeId 员工ID
     * @param yearMonth 年月（格式：yyyy-MM）
     * @return 考勤统计信息
     */
    Map<String, Object> getMonthlyStatistics(Long employeeId, String yearMonth);
    
    /**
     * 获取部门某月考勤统计
     *
     * @param deptId 部门ID
     * @param yearMonth 年月（格式：yyyy-MM）
     * @return 考勤统计信息
     */
    Map<String, Object> getDeptMonthlyStatistics(Long deptId, String yearMonth);
    
    /**
     * 校验员工是否在考勤范围内
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @param ruleId 考勤规则ID
     * @return 是否在考勤范围内
     */
    boolean isInAttendanceArea(Double longitude, Double latitude, Long ruleId);
    
    /**
     * 获取员工当天考勤状态
     *
     * @param employeeId 员工ID
     * @param date 日期
     * @return 考勤状态
     */
    String getEmployeeDailyStatus(Long employeeId, LocalDate date);
    
    /**
     * 获取员工月度考勤日历数据
     *
     * @param employeeId 员工ID
     * @param yearMonth 年月（格式：yyyy-MM）
     * @return 日历数据列表
     */
    List<CalendarItemDTO> getMonthlyCalendar(Long employeeId, String yearMonth);
    
    /**
     * 批量导入考勤记录
     *
     * @param batchImportDTO 批量导入参数
     * @return 导入结果
     */
    Map<String, Object> batchImport(BatchImportDTO batchImportDTO);
    
    /**
     * 从文件导入考勤记录
     *
     * @param filePath 文件路径
     * @param source 数据来源
     * @param operator 操作人
     * @return 导入结果
     */
    Map<String, Object> importFromFile(String filePath, String source, String operator);
    
    /**
     * 校验导入数据并转换为实体
     *
     * @param importDTO 导入DTO
     * @return 实体对象
     */
    AttendanceRecord validateAndConvert(AttendanceRecordImportDTO importDTO);
} 